<?php
declare (strict_types = 1);

namespace app\api\controller;

use app\api\model\Admin;
use app\api\service\TokenService;
use think\Request;
use think\response\Json;

/**
 * 认证控制器
 * 处理用户认证相关的接口
 */
class Auth
{
    /**
     * 用户登录
     * 前端期望的响应格式：
     * {
     *   token: string,
     *   refreshToken: string
     * }
     * @param Request $request
     * @return Json
     */
    public function login(Request $request): Json
    {
        // 获取请求参数（兼容 userName 和 username）
        $username = $request->param('username', '') ?: $request->param('userName', '');
        $password = $request->param('password', '');
        
        // 验证参数
        if (empty($username) || empty($password)) {
            return json([
                'code' => 400,
                'msg' => '用户名和密码不能为空',
                'data' => null
            ], 400);
        }
        
        try {
            // 查找用户
            $admin = Admin::findByName($username);
            
            if (!$admin) {
                return json([
                    'code' => 401,
                    'msg' => '用户名或密码错误',
                    'data' => null
                ], 401);
            }
            
            // 检查用户是否激活
            if (!$admin->isActive()) {
                return json([
                    'code' => 403,
                    'msg' => '该账号已被禁用，请联系管理员',
                    'data' => null
                ], 403);
            }
            
            // 验证密码
            if (!$admin->verifyPassword($password)) {
                return json([
                    'code' => 401,
                    'msg' => '用户名或密码错误',
                    'data' => null
                ], 401);
            }
            
            // 生成 token 和 refreshToken
            $token = TokenService::generate($admin->id, [
                'username' => $admin->name,
                'role_id' => $admin->role_id,
            ]);
            
            // 生成 refreshToken（有效期更长，用于刷新 token）
            $refreshToken = TokenService::generate($admin->id, [
                'username' => $admin->name,
                'role_id' => $admin->role_id,
                'type' => 'refresh'
            ], 30 * 24 * 3600); // 30天
            
            // 返回成功信息（符合前端 LoginToken 格式）
            return json([
                'code' => 0,
                'msg' => '登录成功',
                'data' => [
                    'token' => $token,
                    'refreshToken' => $refreshToken
                ]
            ]);
            
        } catch (\Exception $e) {
            return json([
                'code' => 500,
                'msg' => '登录失败：' . $e->getMessage(),
                'data' => null
            ], 500);
        }
    }
    
    /**
     * 获取当前登录用户信息
     * 前端需要的字段格式：
     * {
     *   userId: string,
     *   userName: string,
     *   roles: string[],
     *   buttons: string[]
     * }
     * @param Request $request
     * @return Json
     */
    public function getUserInfo(Request $request): Json
    {
        // 获取 token
        $token = $request->header('Authorization', '');
        $token = str_replace('Bearer ', '', $token);
        
        if (empty($token)) {
            $token = $request->param('token', '');
        }
        
        if (empty($token)) {
            return json([
                'code' => 401,
                'msg' => '未登录或登录已过期',
                'data' => null
            ], 401);
        }
        
        try {
            // 验证 token
            $tokenData = TokenService::verify($token);
            
            if ($tokenData === false) {
                return json([
                    'code' => 401,
                    'msg' => 'Token 无效或已过期',
                    'data' => null
                ], 401);
            }
            
            // 获取用户信息
            $admin = Admin::find($tokenData['user_id']);
            
            if (!$admin) {
                return json([
                    'code' => 404,
                    'msg' => '用户不存在',
                    'data' => null
                ], 404);
            }
            
            // 检查用户是否激活
            if (!$admin->isActive()) {
                return json([
                    'code' => 403,
                    'msg' => '该账号已被禁用',
                    'data' => null
                ], 403);
            }
            
            // 获取用户的角色和权限信息
            $userInfo = $admin->getUserInfoForFrontend();
            
            return json([
                'code' => 0,
                'msg' => '获取成功',
                'data' => $userInfo
            ]);
            
        } catch (\Exception $e) {
            return json([
                'code' => 500,
                'msg' => '获取用户信息失败：' . $e->getMessage(),
                'data' => null
            ], 500);
        }
    }
    
    /**
     * 刷新 Token
     * 前端期望的响应格式：
     * {
     *   token: string,
     *   refreshToken: string
     * }
     * @param Request $request
     * @return Json
     */
    public function refreshToken(Request $request): Json
    {
        // 获取 refreshToken
        $refreshToken = $request->param('refreshToken', '');
        
        if (empty($refreshToken)) {
            return json([
                'code' => 400,
                'msg' => 'RefreshToken 不能为空',
                'data' => null
            ], 400);
        }
        
        try {
            // 验证 refreshToken
            $tokenData = TokenService::verify($refreshToken);
            
            if ($tokenData === false) {
                return json([
                    'code' => 401,
                    'msg' => 'RefreshToken 无效或已过期',
                    'data' => null
                ], 401);
            }
            
            // 检查是否为 refresh 类型的 token
            if (!isset($tokenData['type']) || $tokenData['type'] !== 'refresh') {
                return json([
                    'code' => 401,
                    'msg' => '无效的 RefreshToken',
                    'data' => null
                ], 401);
            }
            
            // 获取用户信息
            $userId = $tokenData['user_id'];
            $admin = Admin::find($userId);
            
            if (!$admin) {
                return json([
                    'code' => 404,
                    'msg' => '用户不存在',
                    'data' => null
                ], 404);
            }
            
            // 检查用户是否激活
            if (!$admin->isActive()) {
                return json([
                    'code' => 403,
                    'msg' => '该账号已被禁用',
                    'data' => null
                ], 403);
            }
            
            // 生成新的 token
            $newToken = TokenService::generate($userId, [
                'username' => $admin->name,
                'role_id' => $admin->role_id,
            ]);
            
            // 生成新的 refreshToken
            $newRefreshToken = TokenService::generate($userId, [
                'username' => $admin->name,
                'role_id' => $admin->role_id,
                'type' => 'refresh'
            ], 30 * 24 * 3600); // 30天
            
            // 删除旧的 refreshToken
            TokenService::delete($refreshToken);
            
            return json([
                'code' => 0,
                'msg' => 'Token 刷新成功',
                'data' => [
                    'token' => $newToken,
                    'refreshToken' => $newRefreshToken
                ]
            ]);
            
        } catch (\Exception $e) {
            return json([
                'code' => 500,
                'msg' => 'Token 刷新失败：' . $e->getMessage(),
                'data' => null
            ], 500);
        }
    }
}
